<?php

declare(strict_types=1);

namespace app\common\lib;

/**
 * 严格模式下针对string字符串操作的基础类库
 * Class Str
 * @package app\common\lib
 */
class Str
{

    /**
     * 获取用户密码
     * @param string $password
     * @return string
     */
    public static function getUserPassword(string $password): string
    {
        return md5($password . '_df');
    }

    /**
     * 生成登录所需的token
     * @param $string
     * @return string
     */
    public static function getLoginToken($string)
    {
        //生成token
        $str = md5(uniqid(md5(microtime(false)), false));//生成一个不会重复的字符串
        $token = sha1($str . $string);
        return $token;
    }

    //生成订单编号
    public static function makeOrderNum()
    {
        $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K');
        $orderSn =
            $yCode[intval(date('Y')) - 2018] . strtoupper(dechex((int)date('m'))) . date(
                'd') . substr((string)time(), -5) . substr(microtime(), 2, 5) . sprintf(
                '%02d', rand(0, 99));
        return $orderSn;
    }

    //生成退款请求流水号
    public static function makeRefundNum()
    {
        $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J','K');
        $orderSn =
            $yCode[intval(date('Y')) - 2018] . strtoupper(dechex((int)date('m'))) . date(
                'd') . substr((string)time(), -5) . substr(microtime(), 2, 5) . sprintf(
                '%02d', rand(0, 99));
        return 'R_'.$orderSn;
    }

    /**
     * 过滤微信昵称特殊符号
     * @param $str
     * @return string|string[]|null
     */
    public static function filterEmoji($str)
    {
        $str = preg_replace_callback(    //执行一个正则表达式搜索并且使用一个回调进行替换
            '/./u',
            function (array $match) {
                return strlen($match[0]) >= 4 ? '' : $match[0];
            },
            $str);
        return $str;
    }

    /**
     * 18位身份证校验码有效性检查
     * @param $idcard
     * @return bool
     */
    public static function idcardCheck($idcard){
        if (strlen($idcard) != 18){ return false; }
        $idcard_base = substr($idcard, 0, 17);
        if (self::idcardVerifyNumber($idcard_base) != strtoupper(substr($idcard, 17, 1))){
            return false;
        }else{
            return true;
        }
    }
    // 计算身份证校验码，根据国家标准GB 11643-1999
    public static function idcardVerifyNumber($idcard_base) {
        if(strlen($idcard_base) != 17) {
            return false;
        }
        //加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
        //校验码对应值
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
        $checksum = 0;
        for ($i = 0; $i < strlen($idcard_base); $i++) {
            $checksum += substr($idcard_base, $i, 1) * $factor[$i];
        }
        $mod = $checksum % 11;
        $verify_number = $verify_number_list[$mod];
        return $verify_number;
    }

    //通过身份证号获取性别
    public static function getSexByIdCard($id_card){
        $sex = substr($id_card, (strlen($id_card)==18 ? -2 : -1), 1) % 2 ? '1' : '2';
        return $sex;
    }

    //姓名等字符串隐私处理
    public static function dealSecretString($value){
        $first = mb_substr($value,0,1);

        $starWord = '';
        $str_len = mb_strlen($value);
        for ($i=0;$i<$str_len-1;$i++){//减去第一个字
            $starWord.='*';
        }

        $result = $first.$starWord;
        return $result;
    }

    public static function globalRequestDomain(){
        //$domain = str_replace('http://','https://',request()->domain());
        $domain = request()->domain();//上线前解开注释
        return $domain;
    }
}
